
#include <limits>

/**
  *
  */
void AjouterBillet()
{
    system("cls");
    string idVoyageurStr;
    char rep;
    string repStr;
    int idVoyageur;
    cin.ignore(numeric_limits<int>::max(), '\n');
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                       AJOUT D'UN BILLET                                 #"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #    Numero : "<<nbBillets+1<<endl;
    cout<<"  #"<<endl;
    cout<<"  #  Listes de voyageurs : "<<endl;
    cout<<"  #"<<endl;
    do
    {
        list<Voyageur*>::iterator itv;
        for(itv=listVoyageurs.begin();itv!=listVoyageurs.end();itv++)
        {
            cout<<"  #  "<<(*itv)->getIdPersonne()<<" : "<<(*itv)->Afficher()<<endl;
        }
        cout<<"  #"<<endl;
        cout<<"  #  Voyageur : ";getline(cin, idVoyageurStr);
        idVoyageur = atoi(idVoyageurStr.c_str());
        Voyageur * v = rechercherVoyageur(idVoyageur);
        if(v != NULL)
        {
            cout<<"  #  ";v->AfficherVoyageur();cout<<endl;
            cout<<"  #  Est-ce le bon voyageur ? [o/n] ";
            getline(cin, repStr);
        }
        else
        {
            cout<<"  # Numero inexistant ! "<<endl;
        }
        rep = repStr[0];
    }
    while(rep!='o' && rep!='O');

    system("PAUSE");
    cout<<"  #"<<endl;
    cout<<"  #  CREATION DU BILLET..."<<endl;
    Voyageur* voy = rechercherVoyageur(idVoyageur);
    Billet * b = new Billet(nbBillets+1,voy,NULL,0.0);
    nbBillets = nbBillets+1;
    listBillets.push_back(b);

    listBillets.sort();
}

/**
  *
  */
void ModifierBillet()
{
    int num, idVoy;
    string idVoyStr;
    bool estListe = false;

    system("cls");
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                   MODIFICATION DES BILLETS                              #"<<endl;
    cout<<"  #                                                                         #"<<endl;



    list<Billet*>::iterator it;
    for(it = listBillets.begin();it != listBillets.end();it++)
    {
        cout<<"  #  "<<(*it)->getNumero()<<" : "<<(*it)->getVoyageur()->getIdPersonne()<<endl;
    }
    cout<<"  #    Entrez le numero du billet a modifier : ";cin>>num;
    for(it = listBillets.begin();it != listBillets.end();it++)
    {
        if((*it)->getNumero() == num)
        {
            system("cls");
            cout<<"  ###########################################################################"<<endl;
            cout<<"  ##                                                                       ##"<<endl;
            cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
            cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
            cout<<"  ##                                                                       ##"<<endl;
            cout<<"  ###########################################################################"<<endl;
            cout<<"  #                                                                         #"<<endl;
            cout<<"  #                   MODIFICATION DU BILLET                                #"<<endl;
            cout<<"  #                                                                         #"<<endl;
            estListe = true;
            cout<<"  #  Modification du billet numero "<<(*it)->getNumero()<<" du voyageur "<<(*it)->getVoyageur()->getIdPersonne()<<endl;
            cout<<"  #"<<endl;
            cout<<"  #     Num voyageur : ";
            // DOUBLE GETLINE DE RAFFISTOLAGE...
            getline(cin, idVoyStr);getline(cin,idVoyStr);
            idVoy = atoi(idVoyStr.c_str());
            Voyageur* voy = rechercherVoyageur(idVoy);
            (*it)->setVoyageur(voy);
        }
    }
    if(!estListe)
    {
        system("cls");
        cout<<"  ###########################################################################"<<endl;
        cout<<"  ##                                                                       ##"<<endl;
        cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
        cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
        cout<<"  ##                                                                       ##"<<endl;
        cout<<"  ###########################################################################"<<endl;
        cout<<"  #                                                                         #"<<endl;
        cout<<"  #                 MODIFICATION DU BILLET                                  #"<<endl;
        cout<<"  #                                                                         #"<<endl;
        cout<<"  #  Numero inconnu ! "<<endl;
    }
}

/**
  *
  */
void SupprimerBillet()
{
    int num;
    bool estListe = false;
    list<Billet*> listAlt ;

    system("cls");
    cout<<"  ###########################################################################"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
    cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
    cout<<"  ##                                                                       ##"<<endl;
    cout<<"  ###########################################################################"<<endl;
    cout<<"  #                                                                         #"<<endl;
    cout<<"  #                 SUPPRESSION D'UN BILLET                                 #"<<endl;
    cout<<"  #                                                                         #"<<endl;

    list<Billet*>::iterator it;
    for(it = listBillets.begin();it != listBillets.end();it++)
    {
        cout<<"  #  "<<(*it)->getNumero()<<" : "<<(*it)->getVoyageur()->getIdPersonne()<<endl;
    }
    cout<<"  #    Entrez le numero du billet a supprimer : ";cin>>num;
    for(it = listBillets.begin();it != listBillets.end();it++)
    {
        if((*it)->getNumero() == num)
        {
            estListe = true;
        }
        else
        {
            listAlt.push_back(*it);
        }
    }
    cout<<"3";
    if(!estListe)
    {
        cout<<"  #  Numero inconnu ! "<<endl;
    }
    else
    {
        listBillets.erase(listBillets.begin(),listBillets.end());
        listBillets = listAlt ;
    }
}

/**
  *
  */
void AfficherBillets()
{
    string choix;
    bool trouve = false;

    do {

        system("cls");
        cout<<"  ###########################################################################"<<endl;
        cout<<"  ##                                                                       ##"<<endl;
        cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
        cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
        cout<<"  ##                                                                       ##"<<endl;
        cout<<"  ###########################################################################"<<endl;
        cout<<"  #                                                                         #"<<endl;
        cout<<"  #                        AFFICHAGE DES BILLETS                            #"<<endl;
        cout<<"  #                                                                         #"<<endl;

        if(listBillets.empty())
        {
            cout<<"  #                La liste de billets est vide !                           #"<<endl;
            cout<<"  #                                                                         #"<<endl;
            cout<<"  ###########################################################################"<<endl;
            choix = '0';
        }
        else
        {
            list<Billet*>::iterator it;
            for(it = listBillets.begin();it != listBillets.end();it++)
            {
                cout<<"  #  "<<(*it)->getNumero()<<" : "<<(*it)->getVoyageur()->Afficher();
                if((*it)->getTraversee()!=NULL)
                {
                    cout<<" de "<<(*it)->getTraversee()->getPortOrigine()->getNomPort()<<" a "<<(*it)->getTraversee()->getPortDestination()->getNomPort()<<endl;
                }
                else
                {
                    cout<<" pas de traversee "<<endl;
                }
            }
            cout<<"  #                                                                         #"<<endl;
            cout<<"  #                                                                         #"<<endl;
            cout<<"  # ----------------------------------------------------------------------- #"<<endl;
            cout<<"  #    Pour afficher un element particulier, saisissez son numero. Sinon,   #"<<endl;
            cout<<"  #    saisissez 0 [zero] pour revenir au menu precedent.                   #"<<endl;
            cout<<"  # ----------------------------------------------------------------------- #"<<endl;
            cout<<"  #                                                                         #"<<endl;
            cout<<"  #    VOTRE CHOIX : ";cin>>choix;
            cout<<"  #                                                                         #"<<endl;
            trouve = false;
            if(choix != "0")
            {
                for(it=listBillets.begin();it!=listBillets.end();it++)
                {
                    if((*it)->getNumero()==atoi(choix.c_str()))
                    {
                        string choix2;
                        choix2="0";
                        do
                        {
                            system("cls");
                            cout<<"  ###########################################################################"<<endl;
                            cout<<"  ##                                                                       ##"<<endl;
                            cout<<"  ##                  Bienvenue dans le logiciel de gestion                ##"<<endl;
                            cout<<"  ##                      de le compagnie maritime AM.LB                   ##"<<endl;
                            cout<<"  ##                                                                       ##"<<endl;
                            cout<<"  ###########################################################################"<<endl;
                            cout<<"  #                                                                         #"<<endl;

                            if(choix2=="1")
                            {
                                cout<<"  #  AJOUT D'UNE TRAVERSEE AU BILLET "<<(*it)->getNumero()<<endl;
                                list<Traversee*> liste = getTraverseesCourantes();
                                list<Traversee*>::iterator itL;
                                for(itL=liste.begin();itL!=liste.end();itL++)
                                {
                                    cout<<"  #  "<<(*itL)->getIdTraversee()<<" : de ";
                                    cout<<(*itL)->getPortOrigine()->getNomPort()<<" a ";
                                    cout<<(*itL)->getPortDestination()->getNomPort()<<endl;
                                }
                                int idAdd;
                                cout<<"  #  ID de la traversee : ";cin>>idAdd;
                                Traversee* trAdd = rechercherTraversee(idAdd);
                                (*it)->setTraversee(trAdd);
                                system("PAUSE");
                                choix2="r";
                            }
                            else if (choix2=="2")
                            {
                                cout<<"SUPP";
                                choix2="r";
                            }
                            else
                            {
                                // AFFICHAGE
                                cout<<"  #  Billet numero "<<(*it)->getNumero()<<endl;
                                cout<<"  #  Voyageur : "<<(*it)->getVoyageur()->getNom()<<" "<<(*it)->getVoyageur()->getNom()<<" ["<<(*it)->getVoyageur()->getIdPersonne()<<"]"<<endl;
                                cout<<"  #  Prix : "<<(*it)->getPrixCalcule()<<endl;
                                trouve = true;
                                cout<<"  #"<<endl;
                                cout<<"  #  1 : Ajouter une traversee"<<endl;
                                cout<<"  #"<<endl;
                                cout<<"  #  0 : Retour au menu precedent"<<endl;
                                cout<<"  #"<<endl;
                                cout<<"  #  VOTRE CHOIX : ";cin>>choix2;
                            }
                        }
                        while(choix2 != "0");
                    }
                }
                if(!trouve)
                {
                    // NUMERO INCONNU
                    cout<<"  #  NUMERO INCONNU"<<endl;
                }
            }
        }
        cout<<"  #  ";system("PAUSE");
    }
    while(choix != "0");


}


